package com.cskaoyan.javase.oop1._5this;

import javax.swing.*;
import java.nio.charset.CharsetEncoder;

/**
 * 学习完对象与类后，做以下练习：
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 * 实现：
 * 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 * 思考：
 * 两次方法调用的结果一样吗？为什么？
 *
 *
 * 当存在成员方法的形参名和成员变量名相同时,在方法体中访问这个变量名,由于就近原则,所以这里访问的同名变量是局部变量,而不是类中的成员变量.
 *
 * 在存在同名局部变量形参和成员变量时，怎么办才能够访问到同名成员变量呢？
 *
 * 这时就需要this关键字
 * this关键字:
 *      在java某个类的每一个成员方法中,它的形参列表中,都存在一个隐式的传参,传入的是当前对象,这个当前对象,用this关键字指向它.
 *      所以this其实是一个引用,指向当前对象
 *
 *      何为当前对象?
 *      当前对象作为一个隐式传参,传给成员方法
 *      而成员方法必须使用一个对象来调用它
 *      所以哪个对象来调用成员方法
 *      这个对象就是这个成员方法的当前对象
 *
 * this关键字的作用:
 *      1.当成员方法中存在同名成员变量和局部形参变量时,可以用this关键字做区分.
 *      语法是
 *      this.成员变量名
 *      就是访问成员变量,而不是同名局部变量
 *
 *      2.正是由于成员方法中隐含了this传参
 *         所以成员方法中才能任意访问成员变量和其它成员方法.
 *         但是在一般情况下,没有必要把"this."
 *         写出来
 *         因为本身就是一个隐式传参
 *
 *         注:
 *         static方法中是不能访问成员变量和成员方法的,原因就是因为没有this传参,没有对象
 *         所以才不能访问类的成员
 *
 *      3.未完待续.
 *
 * @since 17:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        // c.run();
        c.run(180);
        System.out.println(c);

        System.out.println("--------------");

        Car c2 = new Car();
        c2.run(130);
        System.out.println(c2);

    }
}

class Car {
    char color;
    double speed = 80;

    public void run(double speed) {
        // this是一个引用,指向当前对象
        System.out.println(this);
        System.out.println("小汽车以" + this.speed + "的速度,嘟嘟嘟的奔驰在高速公路上!");
        System.out.println(this.color);
        System.out.println(speed);
        this.test();
    }

    public void test(){}

    public static void testStatic(){
        // static方法没有隐含this传参
        // 所以static方法不能直接访问成员变量和方法
        // 不能访问的原因是没有对象,只要创建对象就仍然可以访问
        Car c = new Car();
        c.test();
        System.out.println(c.speed);
    }
}

